Bingo, Computer Graphics & Game Developer

Triangle库的封装

1.基于数据驱动的命令行使用方式

-z 指针指向的数据集开始的位置为0
-Q 不会输出任何调式信息
-V 输出调试信息
-N 不会在三角形上出现边界线


2.triangleio的结构体简析

-pointlist 点坐标集合(数组)
-pointattributelist 点属性数组(每个点的属性占据一个numberOfPointAttributes中的一个位置)
-pointmarkerlist 点标记数组(每个点一个int)


-trianglelist 三角形拐角数组(从第一个[0]开始 另外的两个拐角逆时针顺序存放)
-triangleattributelist 三角形属性数组(每个三角形的属性都会占据一个numberoftriangleattributes中的一个位置)
-trianglearealist 一个三角形面积约束的数组(input only) 用于限制生成的三角形面积大小不一的情况 PS:暂时不清楚[0]和[1]的作用
-neighborlist 三角形相邻三角形的数组 每一个三角形占据三个int数据(output only)


-segmentlist 段断点的数组集合 从第一段占据的[0]和[1]开始依次为剩余的段(每段占据两个int型数据)
-segmentmarkerlist 段标记 每段一个标记(int)


-holelist 洞数组 第一个孔的x, y 坐标为[0]和[1] 剩余的依次为其余的孔(每个孔占两个实数 input only但为了方便起见也会将结果拷贝到output的结构体当中)
-regionlist 地区范围属性(给定的点集的最大AABB/最大xy范围)和面积约束的数组 第一个约束是x, y 坐标占[0]和[1] 其次是范围属性[2] 最后是最大的面积约束[3] 因此每个范围约束都会占据四个int型数据 PS:范围属性只在传入-A参数才有效 面积约束只在传入-a参数才会有效


-edgelist 边缘数组 第一个边缘的结束点占位[0]和[1] 剩余按照顺序依次占据(output only)
-edgemarkerlist 边缘标记数组(每个边缘占一个int型数据 output only)
-normlist 法向量数组 用于确定泰森多边形法图解中的无限远射线 第一个法向量的x, y坐标占据[0]和[1] 剩余法向量依次顺序占位 对于每个泰森多边形法图解的无限远边缘而言 法向量会填写为零向量(output only)


3.对于每个需要输出的结构体中的指针都必须要分配好合适的空间 或者可以将指针初始化为NULL 这样triangle库本身就会帮你分配所需要的内存空间
PS:原作者推荐奖指针初始化为NULL 因为前者的方法多数用于Fortran代码dangzhong

triangle也不会自动的释放in/out的数组 这都取决于使用者 trifree()的本质就是调用标准库的free()


4.必须要在triangulate()之前初始化好的部分

in
pointlist 必须是指向一系列点指针的指针
numberofpoints和numberofpointattributes 应该被合理的设置
pointmarkerlist = NULL(所有的标记都应该设置为NULL)
pointattributelist 务必是一个指向点属性的指针
使用了-r命令 那么trianglelist就必须要指向一列三角形 numberoftriangles numberofcorners以及numberoftriangleattributes都必须要根据其本身的含义来初始化
numberoftriangleattributes != 0 那么triangleattributelist就要指向一三角形属性集合
使用了-a命令 trianglearealist就一定要指向一的面积约束数组
可以忽略neighborlist, edgelist, edgemarkerlist, normlist, numberofedges的初始化
使用了-p命令 segmentlist就必须要指向一片段集合 numberofsegments就要根据其本身含义来初始化;holelist numberofholes 以及numberofregions都会被拷贝至out结构体当中 除非使用了-r命令 否则使用者是不要初始化这些部件的
segmentmarkerlist = NULL(使用库本身的空间分配) 否则就需要自己手动指向一标记集合


out

pointlist 需要被初始化(NULL / 指向一定的内存空间) 除非使用了-N命令
pointmarkerlist 需要被初始化(NULL / 指向一定的内存空间) 除非使用了-N 或者 -B命令
in->numberofpointattributes != 0 并且没有是使用过-N命令 pointattributelist就需要被初始化
trianglelist 需要被初始化 除非使用了-E命令
neighborlist 需要被初始化 除非使用了-n命令
in->numberofelementattributes != 0并且没有使用-E命令而是使用了-A命令 那么elementattributelist需要被初始化
trianglearealist, holelist, regionlist, normlist以及其他的标量初始化可以被忽略
使用了-p或者-c命令并且没有使用-P命令的话 那么segmentlist就需要被初始化
使用了-B命令 segmentmarkerlist 也需要被初始化
使用了-e命令 edgelist需要被初始化 在此基础上 倘若没有使用-B命令 那么edgemarkerlist也需要被初始化


vorout(只有在使用了-r命令后才需要这部分的参数)

pointlist需要被初始化
edgelist 和 normlist都需要被初始化
in->numberofpointattributes != 0 那么pointattributelist也需要被初始化
pointmarkerlist, edgemarkerlist以及上述中没有出现的都可以被忽略


5.segment段和hole是需要互相配合使用的

segment为多边形中小孔相关线段形成的闭合区域

hole部分只需要是孔中的任意一点即可